<?php
// https://www.cnblogs.com/littlepanpc/p/7671817.html
/*public int findCeil(int src) {
    char[] chars = String.valueOf(src).toCharArray();
     for (int i = chars.length - 1; i> -1; i--) {
        　　int index = -1;
     　　int lastIndex = i;
     　　char lastChar = chars[lastIndex];
         　for (int j = i - 1; j > -1; j--) {
            　if (chars[i] < lastChar) {
            　index = i;
            　break;
            　}
         　}
         　if (index > -1) {
         　char ch = chars[index];
             　chars[index] = lastChar;
             　chars[lastIndex] = ch;
             　quickSort(chars, index + 1, chars.length - 1);
             　return Integer.parseInt(String.valueOf(chars));
         　} else {
            　continue;
            　}
     }
     return src;
 }*/
// 核心点：涉及到数的应该是从个位往左开始遍历，因为每一位代表的level不同
function findNextNumber($src)
{
    $char_len = strlen($src);
    $chars = str_split($src);

    for($i = $char_len - 1; $i>=0; $i--) {
        $index = -1;
        $lastIndex = $i;
        $lastChar = $chars[$i];

        // 判断前面的数是否有比后面小的
        for ($j=$i-1; $j>=0; $j--) {
            if (intval($chars[$j]) < intval($lastChar)) {
                $index = $j;
                break;
            }
        }

        if ($index != -1) {
            // 交换两个位置的数
            $char = $chars[$index];
            $chars[$index] = $lastChar;
            $chars[$lastIndex] = $char;

            // 截取交换位置后面的数，然后升序排列
            $numbers = array_slice($chars, $index+1);
            sort($numbers);

            return implode("", array_merge(array_slice($chars, 0, $index+1), $numbers));
        }
    }

    return $src;
}

echo findNextNumber(1570);